import { ShapeFlags } from "../shared";
/**
 * 创建虚拟DOM节点
 * @param type 节点类型
 * @param props 节点props属性
 * @param children 节点子元素
 */
export const createVNode = function(
    type: any,
    props?: any = {},
    children: string | Array<any>
){
    // 注意这里的type有可能是 string 也有可能是一个对象
    // 如果是对象，那么就是用户设置的options
    // type 为 string 的时候， createVNode("div")
    // type 为组件对象的时候: createVNode(App)
    const vnode = {
        el: null,
        component: null,
        key: props.key || null,
        type,
        props,
        children,
        shapeFlag: getShapeFlag(type)
    }
    // 基于 children 再次设置 shapeFlag:
    if(Array.isArray(children)){
        vnode.shapeFlag |= ShapeFlags.ARRAY_CHILDREN;
    }else if(typeof children === "string"){
        vnode.shapeFlag |= ShapeFlags.TEXT_CHILDREN;
    }
    return vnode;
}

// 基于 type 判断是什么类型的组件
function getShapeFlag(type: any){
    return typeof type === "string"
        ? ShapeFlags.ELEMENT
        : ShapeFlags.STATEFUL_COMPONENT
}